package com.study.scala

/**
 * 函数
 *
 * @author stephen
 * @create 2019-03-18 18:34
 * @since 1.0.0
 */
object FunctionDemo {

  def main(args: Array[String]): Unit = {
    println(sum(1, 2))
    println(sum1(1)(2))
    println(sum2(1)(2))
    println(sum4((x, y) => {
      x + y
    }, 1, 2))
  }

  // 普通函数
  def sum(x: Int, y: Int) = x + y

  // 函数嵌套
  def sum1(x: Int) = {
    def sum(y: Int): Int = {
      x + y
    }
    //  返回值为函数
    sum _
  }

  // 柯里化函数：把接受多个参数的函数变换成接受一个单一参数，等价上面的函数
  def sum2(x: Int)(y: Int) = x + y

  // 闭包，将外部变量引入到函数的内容，改变这个变量的生命周期，如下面的变量x
  // 柯里化一定存在闭包
  def sum3(x: Int) = {
    def sum(y: Int): Int = {
      x + y
    }
    //  返回值为函数
    sum _
  }

  // 函数作为参数
  def sum4(f: (Int, Int) => Int, x: Int, y: Int): Int = {
    f(x, y)
  }
}
